package com.sky.aspect;

import com.sky.annotation.AutoFill;
import com.sky.context.BaseContext;
import com.sky.enumeration.OperationType;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.lang.reflect.Field;
import java.time.LocalDateTime;

/**
 * 自定义切面类，实现公共字段自动填充
 *
 * @Author mr.li
 * @Date 2025/7/6 21:30
 */
@Aspect
@Component
@Slf4j
public class AutoFillAspect {

    //自动填充结果
    @Around(" @annotation(autoFill)")
    public Object autoFill(ProceedingJoinPoint pjp, AutoFill autoFill) throws Throwable {
        log.info("开始进行公共字段自动填充...");

        Signature signature = pjp.getSignature();//获得方法签名
        //还需要获取注解的参数，也就是对数据库操作的类型是什么
            //因为修改员工信息不需要重新设置更新时间
        OperationType type = autoFill.value();


        Object[] args = pjp.getArgs();
        //这里需要判断，如果arg是空就直接返回
        if(args==null&& args.length==0){
            return null;
        }

        Object arg = args[0];
        Class<?> aClass = arg.getClass();


        //判断数据库操作是否是 添加或更新
            //添加   如果是添加就执行这两个
        if(type== OperationType.INSERT){
            Field createTime = aClass.getDeclaredField("createTime");
            createTime.setAccessible(true);//暴力反射
            createTime.set(arg, LocalDateTime.now());//设置创建时间

            Field createUser = aClass.getDeclaredField("createUser");
            createUser.setAccessible(true);
            createUser.set(arg, BaseContext.getCurrentId());//设置创建人
        }

        //如果是修改，就只执行下面的这两个
        Field updateTime = aClass.getDeclaredField("updateTime");
        updateTime.setAccessible(true);//暴力反射
        updateTime.set(arg, LocalDateTime.now());//设置修改时间

        Field updateUser = aClass.getDeclaredField("updateUser");
        updateUser.setAccessible(true);
        updateUser.set(arg, BaseContext.getCurrentId());//设置修改人

        Object result = pjp.proceed();//返回这个最新设置的值

        return result;

    }



}








